<html>
<body>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<canvas id="source"></canvas>
<canvas id="default"></canvas>
<script>

var source = document.createElement('canvas');
source.width = 60;
source.height = 12;
var sourceContext = source.getContext('2d');
var sourceImage = sourceContext.createImageData(source.width, source.height);

function drawBlackDot(x, y) {
    var offset = y * 4 * source.width + x * 4;
    sourceImage.data[offset + 0] = 0 ; // R
    sourceImage.data[offset + 1] = 0 ; // G
    sourceImage.data[offset + 2] = 0 ; // B
    sourceImage.data[offset + 3] = 202 - y ; // Alpha
}

for (var x = 0; x < source.width; x++) {
    for (var y = 1; y < 3; y++) {
         drawBlackDot(x, y);
    }
}

sourceContext.putImageData(sourceImage, 0, 0);

function scaleTestResults(quality){
    var canvas = document.createElement("canvas");
    canvas.id = quality + "Canvas";
    document.body.appendChild(canvas);
    canvas.width = sourceImage.width / 4;
    canvas.height = sourceImage.height / 4;
    return scaleImageData(canvas, quality);
}

function scaleImageData(destinationCanvas, quality) {
    var context = destinationCanvas.getContext("2d");

    if (quality)
        context.imageSmoothingQuality = quality;

    context.drawImage(source, 0, 0, destinationCanvas.width,
                      destinationCanvas.height);
    var data = context.getImageData(0, 0, 1, 1).data;
    context.clearRect(0, 0, destinationCanvas.width, destinationCanvas.height);
    return JSON.stringify(data);
}

function sampleAlpha(data){
    return JSON.parse(data)[3]
}

test(function(t) {
    // On getting, must return the last value it was set to.");
    var lowData = scaleTestResults("low");
    var lowContext = document.getElementById("lowCanvas").getContext('2d');
    assert_equals(lowContext.imageSmoothingQuality, 'low');
    
    var mediumData = scaleTestResults("medium");
    var mediumContext = document.getElementById("mediumCanvas").getContext('2d');
    assert_equals(mediumContext.imageSmoothingQuality, 'medium');
    
    var highData = scaleTestResults("high");
    var highContext = document.getElementById("highCanvas").getContext('2d');
    var highCanvas = document.getElementById("highCanvas");
    assert_equals(highContext.imageSmoothingQuality, 'high');
    
    lowContext.imageSmoothingEnabled = false;
    var noFilterData = scaleImageData(lowCanvas, lowCanvas.imageSmoothingQuality);
   
    // No filtering uses kNone quality, while with imageSmoothingEnabled we use the
    // same quality.
    assert_false(noFilterData === mediumData);
    
    // On setting, it must be set to the new value.
    highContext.imageSmoothingQuality = 'medium';
    assert_equals(highContext.imageSmoothingQuality, 'medium');
    highContext.imageSmoothingQuality = 'high';
    assert_equals(highContext.imageSmoothingQuality, 'high');
    
    // When the CanvasRenderingContext2D object is created, the attribute must be set to 'low'.
    assert_equals(document.getElementById("default").getContext("2d").imageSmoothingQuality, 'low');
    
    // ImageSmoothingQuality can be set without real effect when imageSmoothingEnabled is false.
    highContext.imageSmoothingEnabled = false;
    assert_equals(highContext.imageSmoothingQuality, 'high');
    assert_equals(scaleImageData(highCanvas, highCanvas.imageSmoothingQuality),
                 noFilterData);
    highContext.imageSmoothingQuality = 'medium';
    assert_equals(highContext.imageSmoothingQuality, 'medium');
    assert_equals(scaleImageData(highCanvas, highCanvas.imageSmoothingQuality),
                 noFilterData);
    
    // Invalid Input is not accepted.
    highContext.imageSmoothingEnabled = true;
    highContext.imageSmoothingQuality = 'high';
    scaleImageData(highCanvas, '3223');
    assert_equals(highContext.imageSmoothingQuality, 'high');
    scaleImageData(highCanvas, 'bad_input');
    assert_equals(highContext.imageSmoothingQuality, 'high');
    scaleImageData(highCanvas, 'LOW');
    assert_equals(highContext.imageSmoothingQuality, 'high');
    scaleImageData(highCanvas, 'Medium');
    assert_equals(highContext.imageSmoothingQuality, 'high');
    
    
    // The save() and restore() should work.
    highContext.save();
    highContext.imageSmoothingQuality = 'medium';
    assert_equals(highContext.imageSmoothingQuality, 'medium');
    assert_equals(scaleImageData(highCanvas, highCanvas.imageSmoothingQuality), mediumData);
    highContext.restore();
    assert_equals(highContext.imageSmoothingQuality, 'high');
    assert_equals(scaleImageData(highCanvas, highCanvas.imageSmoothingQuality), highData);
    
    }, 'Tests for the imageSmoothingQuality attribute.');
</script>
</body>
